/**
 * 创建一个代理处理器，用于在属性值改变时触发特定事件
 * @param {Object} vm - Vue实例或组件，用于触发事件
 * @param {string} eventName - 事件名称，当数据变化时将触发此事件
 * @param {...any} args - 其他参数，将与事件一起传递
 * @returns {{set(*, *, *): boolean}} - 包含set陷阱的Proxy处理器对象
 */
export default function computedProxy(vm, eventName, ...args) {
    return {
        set(target, p, newValue) {
            try {
                // 只在数据实际变化时才发送事件
                if (target[p] !== newValue) {
                    // 使用反射设置属性
                    const success = Reflect.set(target, p, newValue);
                    if (!success) {
                        throw new Error('Failed to set property');
                    }
                    // 触发事件，使用lodash的深拷贝方法
                    vm.$emit(eventName, target, ...args);
                }
            } catch (error) {
                console.error('Error in ComputedProxy:', error);
                return false;
            }
            // 数据设置成功
            return true;
        },
    };
}